/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Server;

import Common.Message;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * Class intended to be the server of the Simple Email System
 *
 * @author Wilson Rolando Crespo Omonte
 */
public class MailServer {

    List<UserMessages> userMessages;

    public MailServer() {
        this.userMessages = new LinkedList<>();
    }

    public MailServer(String user) {
        this();
        userMessages.add(new UserMessages(user));
    }
/**
 * retirna el numero de mensajes en espera
 * @param name
 * @return result ,entero
 */
    public int getMessagesWaiting(String name) {
        int result = 0;
        for (UserMessages userMessages1 : userMessages) {
            result += verifyMessageOwner(userMessages1, name);
        }
        return result;
    }
    /**
     * verifica la existencia del usuario con el ultimo elemento de la lista
     * @param userMessages1, lista de usuarios
     * @param name,usuario para comparar
     * @return devuelve el tamaño del mensaje si no coinside el usuario debuelve 0
     */
    private int verifyMessageOwner(UserMessages userMessages1, String name) {
        String user = userMessages1.user;
        if (user.equalsIgnoreCase(name)) {
            List<Message> messages = userMessages1.messages;
            return messages.size();
        }
        return 0;
    }
/**
 * obtiene el siguiente mensaje 
 * @param name , usuario del que obtiene el mensaje
 * 
 */
    public Message getNextMessage(String name) {
        Message result = null;
        int i = 0;
        while (result == null && i < userMessages.size()) {
            result = getMessageIfCorresponds(userMessages.get(i), name);
            i++;
        }
        return result;
    }
    /**
     * 
     * @param userMessages1
     * @param name
     * @return 
     */
    private Message getMessageIfCorresponds(UserMessages userMessages1, String name) {
        String user = userMessages1.user;
        if (user.equalsIgnoreCase(name)) {
            List<Message> messages = userMessages1.messages;
            return removeMessage(messages);
        }
        return null;
    }
    /**
     * retorna el primer mensaje si la lista esta vasia retorna nulo
     * @param messages1
     * @return retorna el primer mensaje
     */
    private Message removeMessage(List<Message> messages1) {
        if (messages1.size() > 0) {
            return messages1.get(0);
        }
        return null;
    }
/**
 * 
 * @param message ,nuevo mensaje a enviar
 */
    public void post(Message message) {
        String user = message.toString();
        String receiverUser = getReceiverUser(user);
        int i = 0;
        boolean sent = false;
        while (i < userMessages.size() && !sent) {
            UserMessages userMessages1 = userMessages.get(i);
            sent = sendMessageIfCorresponds(userMessages1, receiverUser, message);
            i++;
        }

    }
    /**
     * 
     * @param user
     * @return devuelbe el nombre del usuario a quien va dirigido el mensage
     */
    private String getReceiverUser(String user) {
        String[] pieces = user.split(",");
        String[] secondPieces = pieces[1].split(":");
        return secondPieces[1].trim();
    }
    /**
     * envia un mensaje si corresponde devuelbe true 
     * @param userMessages1
     * @param receiverUser
     * @param message
     * @return boolean
     */
    
    private boolean sendMessageIfCorresponds(UserMessages userMessages1, String receiverUser, Message message) {
        String userName = userMessages1.user;
        if (userName.equalsIgnoreCase(receiverUser)) {
            List<Message> messages = userMessages1.messages;
            messages.add(message);
            return true;
        }
        return false;
    }

    /**
     * this methos will add a new user to existing
     * {@link UserMessages usermessages} list
     *
     * @param user, the name of the user to be added
     * @author Wilson Rolando Crespo Omonte
     */
    public void addUser(String user) {
        if (this.userMessages == null) {
            this.userMessages = new LinkedList<>();
        }
        boolean found = false;
        int i = 0;
        while (i < userMessages.size() && !found) {
            found = userExists(user, userMessages.get(i));
            i++;
        }
        if (!found) {
            this.userMessages.add(new UserMessages(user));
        }
    }
    private boolean userExists(String user, UserMessages userMessages1) {
        String userName = userMessages1.user;
        if (userName.equalsIgnoreCase(user)) {
            return true;
        }
        return false;
    }
    public List<String> getRegisteredUsers() {
        List<String> result = new ArrayList<>();
        for (UserMessages userMessages1 : userMessages) {
            result.add(userMessages1.user);
        }
        return result;
    }
}
